#!/usr/bin/env python3
# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import sys

def chargen(modulo, max_chars):
    """Generate a stream of characters on the console.

    The stream is an ever incrementing pattern of characters from the
    following set: 0..9A..Za..z.

    Args:
      modulo:    an int, restart the pattern every modulo characters, if
                 modulo is non zero
      max_chars: an int, stop printing after this number of characters if non
                 zero, if zero - print indefinitely
    """

    base = '0'
    c = base
    counter = 0
    while True:
        sys.stdout.write(c)
        counter = counter + 1

        if (max_chars != 0) and (counter == max_chars):
            sys.stdout.write('\n')
            return

        if modulo and ((counter % modulo) == 0):
            c = base
            continue

        if c == 'z':
            c = base
        elif c == 'Z':
            c = 'a'
        elif c == '9':
            c = 'A'
        else:
            c = '%c' % (ord(c) + 1)


def main(args):
    '''Process command line arguments and invoke chargen if args are valid'''

    modulo = 0
    max_chars = 0

    try:
        if len(args) > 0:
            modulo = int(args[0])
            if len(args) > 1:
                max_chars = int(args[1])
    except ValueError:
        sys.stderr.write('usage %s:'
                         "['seq_length' ['max_chars']]\n")
        sys.exit(1)

    try:
        chargen(modulo, max_chars)
    except KeyboardInterrupt:
        print()

if __name__ == '__main__':
    main(sys.argv[1:])
    sys.exit(0)
